home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / Graphic Elements 3 / GEMisc / GridElement.c < prev    next >
Text File  |  1994-05-28  |  2KB  |  74 lines

  1. /*
  2.     GridElement.h
  3.     
  4.     A Graphic Element used to break up large background pictures for faster updating. 
  5.     
  6.     Makes a basic PICT element, then clones it as necessary to convert it to a
  7.     set of tiles with width elemWidth and height elemHeight.
  8.     
  9.     The elements created are assigned sequential IDs beginning at startID.
  10.     NewGridPICT returns the first element created.
  11.     
  12.     For convenience, the elements are linked through their masterGrafEl/slaveGrafEl
  13.     fields. The element with ID startID is the head of the list.
  14.     
  15.     Copyright 1994 by Al Evans. All rights reserved.
  16.     
  17.     3/1/94
  18.     
  19. */
  20.  
  21. #include "GridElement.h"
  22. #include "Rects.h"
  23.  
  24. GrafElPtr NewGridPICT(GEWorldPtr world, OSType startID, short plane, short resNum,
  25.                             short mode, short xPos, short yPos, short elemWidth,
  26.                             short elemHeight)
  27. {
  28.     GrafElPtr    firstElement;
  29.     GrafElPtr    currElement;
  30.     GrafElPtr    nextElement;
  31.     OSType         currID = startID;
  32.     Rect        totalRect, gridRect;
  33.     Rect        tempRect;
  34.     
  35.     firstElement = NewBasicPICT(world, currID, plane, resNum, mode, xPos, yPos);
  36.     if (firstElement == nil) return nil;
  37.     
  38.     currElement = firstElement;
  39.     totalRect = currElement->graphRect;
  40.     gridRect = totalRect;
  41.     gridRect.right = gridRect.left + ScaleToWorld(world, elemWidth);
  42.     gridRect.bottom = gridRect.top + ScaleToWorld(world, elemHeight);
  43.     
  44.     do {
  45.         tempRect = gridRect;
  46.         (void) RectsIntersect(&totalRect, &tempRect);
  47.         currElement->graphRect = tempRect;
  48.         RectOffset(&tempRect, ScaleToWorld(world,xPos), ScaleToWorld(world, yPos));
  49.         currElement->animationRect = tempRect;
  50.         RectOffset(&gridRect, ScaleToWorld(world, elemWidth), 0);
  51.         if (gridRect.left >= totalRect.right) {
  52.             RectOffset(&gridRect, 0, ScaleToWorld(world, elemHeight));
  53.             if (gridRect.top >= totalRect.bottom)
  54.                 break;                                //Normal exit
  55.             gridRect.left = totalRect.left;
  56.             gridRect.right = gridRect.left + ScaleToWorld(world, elemWidth);
  57.         }
  58.         currID++;
  59.         nextElement = NewBasicPICT(world, currID, plane, resNum, mode, xPos, yPos);
  60.         if (nextElement == nil)
  61.             goto abort;                                //oops
  62.         currElement->slaveGrafEl = nextElement;
  63.         nextElement->masterGrafEl = currElement;
  64.         currElement = nextElement;
  65.         
  66.     } while (1);
  67.     return firstElement;
  68. abort:
  69.     DisposeGrafElement(world, firstElement->objectID);
  70.     return nil;
  71. }
  72.  
  73.  
  74.